#ifndef FHE_PRIMS_SCENENODE_H
#define FHE_PRIMS_SCENENODE_H

#include <fhe/prims/IRenderable.h>
#include <fhe/prims/IRenderContext.h>
#include <fhe/prims/SpatialNode.h>

namespace fhe
{
  namespace core
  {
    template <size_t D, typename T>
    class SceneNode : public SpatialNode<D,T>, public IRenderable<D,T>
    {
    public:
      typedef SpatialNode<D,T> Super;
      typedef IRenderContext<D,T> RC;
      typedef Mat<D,T> M;
      typedef typename M::V V;
      typedef typename M::R R;
      
      SceneNode()
        : Super()
      {
      }
      
      virtual ~SceneNode()
      {
      }
      
      virtual void render( RC* context )
      {
        context->translate( Super::position );
        context->rotate( Super::rotation );
        context->scale( Super::scale );
      }
      
      virtual void unrender( RC* context )
      {
        context->popTransform();
        context->popTransform();
        context->popTransform();
      }
    };
    
    typedef SceneNode<2,double> SceneNode2d;
    typedef SceneNode<2,int> SceneNode2i;
    typedef SceneNode<3,double> SceneNode3d;
    typedef SceneNode<3,int> SceneNode3i;
  }
}

#endif
